<?php
/**
 * cmd controller
 * @package kernel_lib_cmd
 */
load_lib('/sys/controller');
/**
 * cmd controller
 * @author pandajingjing
 * @package kernel_lib_cmd
 */
abstract class cmd_controller extends sys_controller{

	/**
	 * 程序开始时间
	 * @var float
	 */
	private $_floStartTime='';

	/**
	 * 程序结束时间
	 * @var float
	 */
	private $_floEndTime='';

	/**
	 * 时间花费
	 * @var array
	 */
	private $_arrTimeSpend=array();

	/**
	 * 输出类型
	 * @var string
	 */
	private $_strStdType='';
	
	/**
	 * 输出文件
	 * @var string
	 */
	private $_strStdOutFile='';
	
	/**
	 * 构造函数
	 */
	function __construct(){
		parent::__construct();
	}

	/**
	 * 在控制器开始时执行（调度使用）
	 */
	function beforeRequest(){
		parent::beforeRequest();
		$this->_strStdType=get_config('stdout','cmd');
		if('screen'==$this->_strStdType or ''==$this->_strStdType){

		}else{
			$strCmdName=trim($this->getParam('DISPATCH_PARAM','server'),'/');
			if(''!=$strCmdName){
				$arrStdCfg=get_config($strCmdName,'cmd');
				$strFileName=$strCmdName;
				$arrParam=$this->getParam('REQUEST_ARGV','server');
				if(null!==$arrParam){
					ksort($arrParam);
					foreach($arrParam as $strKey=>$strValue){
						$strFileName.='_'.strtolower($strKey).'-'.$strValue;
					}
				}
				if(null===$arrStdCfg){
					$strFilePath=$this->_strStdType.DIRECTORY_SEPARATOR.$strFileName.'.log';
				}else{
					$intTime=$this->getTime();
					switch($arrStdCfg['split_type']){
						case 'day':
							$strFilePath=$this->_strStdType.DIRECTORY_SEPARATOR.$arrStdCfg['dir'].DIRECTORY_SEPARATOR.date('Y-m-d',$intTime).'_'.$strFileName.'.log';
							break;
						case 'week':
							$strFilePath=$this->_strStdType.DIRECTORY_SEPARATOR.$arrStdCfg['dir'].DIRECTORY_SEPARATOR.date('Y-W',$intTime).'_'.$strFileName.'.log';
							break;
						case 'month':
							$strFilePath=$this->_strStdType.DIRECTORY_SEPARATOR.$arrStdCfg['dir'].DIRECTORY_SEPARATOR.date('Y-m',$intTime).'_'.$strFileName.'.log';
							break;
						case 'persistent':
							$strFilePath=$this->_strStdType.DIRECTORY_SEPARATOR.$arrStdCfg['dir'].DIRECTORY_SEPARATOR.$strFileName.'.log';
							break;
					}
				}
				$stFileDir=dirname($strFilePath);
				if(!is_dir($stFileDir)){
					if(false===mkdir($stFileDir,0755,true)){
						trigger_error(__CLASS__.': can not create path('.$stFileDir.').');
						return false;
					}
				}
				$this->_strStdOutFile=$strFilePath;
			}
		}
		$this->_floStartTime=$this->getMicroTime();
		$this->stdOut('PHP Console Type Start');
	}

	/**
	 * 在控制器结束时执行（调度使用）
	 */
	function afterRequest(){
		$this->stdOut('PHP Console Type End');
		$this->_floEndTime=$this->getMicroTime();
		$this->stdOut('Execute time: '.($this->_floEndTime-$this->_floStartTime));
		parent::afterRequest();
	}

	/**
	 * 计算时间花费
	 * @param string $p_strName
	 */
	protected function calTime($p_strName){
		if(isset($this->_arrTimeSpend[$p_strName])){
			$floTime=$this->getMicroTime();
			$floSpendTime=$floTime-$this->_arrTimeSpend[$p_strName];
			$this->_arrTimeSpend[$p_strName]=$floTime;
			return $floSpendTime;
		}else{
			$this->_arrTimeSpend[$p_strName]=$this->getMicroTime();
		}
	}

	/**
	 * 输出信息到控制台
	 */
	protected function stdOut($p_strMsg){
		$strContent=date('Ymd H:i:s').' '.$p_strMsg.PHP_EOL;
		if('screen'==$this->_strStdType or ''==$this->_strStdType){
			echo $strContent;
		}else{
			if(''!=$this->_strStdOutFile){
				file_put_contents($this->_strStdOutFile,$strContent,FILE_APPEND);
			}
		}
	}
}